package d0918;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.io.*;
import java.util.*;
/*
自定义CMD窗口


命令格式:  命令名（从，dir）  空格[选项] 空格 [文件名或目录名]
 */
public class CMD {
    //当前路径 用户主目录
    //升级为全局变量
    String currentPath = System.getProperty("user.home");

    public static void main(String[] args) {
        CMD cmd = new CMD();
        cmd.start();
    }

    public void start() {

        //打印初始界面，循环输入命令和显示结构，显示当前路径
        String init = "Microsoft Windows [版本 10.0.22000.978]\r\n " +
                "(c) Microsoft Corporation。保留所有权利。";
        System.out.println(init);

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println(currentPath + ">");
            String cmd = sc.nextLine();
            cmd = cmd.trim(); //去掉字符串两边的空格
            // \\s 空格符    + 1-N个
            String[] items = cmd.split("[\\s]+"); //分割数组， 该函数支持正项表达式
            //输出用户名
            //System.out.println(items[0]);
            if ("dir".equalsIgnoreCase(items[0])) {//忽略大小写比较
                dir(items);
            } else if ("cd".equalsIgnoreCase(items[0])) {
                cd(items);
            } else if ("type".equalsIgnoreCase(items[0])) {
                type(items);
            }
            //打印空行
            System.out.println();

        }


    }
    public void dir (String  ...items){
        //默认当前文件夹
        String dirpath = currentPath;
        //定义过滤器
        FileFilter ff = null;
        //如果有第二个参数（指定的文件夹）
        if (items.length == 2) {
            //判断是否带*号
            if (items[1].contains("*")) {
                //带匹配符过滤器
                //构造正项表达式 .* 表示n个字符
                String reg = items[1].replaceAll("\\*", ".*");
                ff = new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        //获取当前文件名
                        String filename = pathname.getName();
                        //判断当前是否过滤
                        boolean ret = filename.matches(reg);
                        return ret;
                    }
                };
            } else {
                //重置查询路径
                dirpath = items[1];
            }
        }
        File dir = new File(dirpath);
        File[] files;
        //如果过滤器不为空，根据过滤器查询
        if (ff != null) {
            files = dir.listFiles(ff);
        } else {
            //查询全部
            files = dir.listFiles();
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年/MM/dd  HH:mm");
        for (File file : files) {
            Date filedate = new Date(file.lastModified());
            String date = sdf.format(filedate);
            String type = file.isFile() ? "  " : "<DIR>";
            String size = file.length() == 0 ? "" : ("" + file.length());
            String name = file.getName();
            System.out.printf("%s  %s  %10s  %s\n", date, type, size, name);
        }

    }
    //带指定目录或文件
    //带匹配过滤查询


    /*
    改变目录
    cd 不带参数 显示当前路径  1个元素
    cd 目录名   进入该目录    2个元素
    cd ..       返回上级目录  2个元素
     */

    public void cd (String[]items){
        if (items.length == 1) {
            System.out.println(currentPath);
        } else if (items.length == 2) {
            File file = new File(currentPath);
            if ("..".equals(items[1])) {
                //将父目录的路径赋给当前目录
                currentPath = file.getParentFile().getAbsolutePath();
            } else {
                //构造子目录对象
                File subDir = new File(file, items[1]);
                //进入子目录
                currentPath = subDir.getAbsolutePath();
            }
        }
    }

    /*
    看看文件内容
    @param items 可改变参数
    相对路径  type a.txt
    相对路径  type c:/a.txt
     */
    public void type (String ...items){
        File file;
        if (items.length < 2) {
            System.out.println("命令格式不正确!");
            return;
        }

        //判断绝对路径==>c:,d: 开头
        if (items[1].matches("[a-zA-Z]:.8")) {
            file = new File(items[1]);
        } else {
            //相对路径
            file = new File(currentPath, items[1]);
        }
        try (FileInputStream fr = new FileInputStream(file);//资源流
             //字节流转字符流，指定字符集编码
             InputStreamReader isr = new InputStreamReader(fr, "utf-8");
             BufferedReader br = new BufferedReader(isr)) {//处理流
            String line;
            while ((line=br.readLine())!=null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("文件读取失败,原因" + e.getMessage());
        }
    }

}


